Modal presentaions
The Scripting app supports SwiftUI-style modal view presentations through declarative properties applied to UI components. These include support for sheet, popover, fullScreenCover, alert, and confirmationDialog. Each of these is defined using structured configuration objects that allow you to present views based on application state.
Alert
Displays an alert with a title, optional message, and one or more actions when the specified condition is true.
1alert?: {
2 title: string
3 isPresented: boolean
4 onChanged: (isPresented: boolean) => void
5 actions: VirtualNode
6 message?: VirtualNode
7}
Properties
title: A string used as the title of the alert.
isPresented: A boolean value that controls the visibility of the alert.
onChanged: A callback function invoked when the isPresented value changes. You must update this value to false when dismissing the alert.
actions: A VirtualNode representing the alert’s actions.
message (optional): A VirtualNode that describes the alert’s message content.
Confirmation Dialog
Displays a confirmation dialog with a title, optional message, and a set of actions. The dialog is shown when the isPresented condition is true.
1confirmationDialog?: {
2 title: string
3 titleVisibility?: Visibility
4 isPresented: boolean
5 onChanged: (isPresented: boolean) => void
6 actions: VirtualNode
7 message?: VirtualNode
8}
Properties
title: The title text for the dialog.
titleVisibility (optional): Determines the visibility of the title. Defaults to "automatic".
isPresented: Controls whether the dialog is currently visible.
onChanged: A callback that updates the isPresented state when the dialog is dismissed.
actions: A VirtualNode representing the dialog’s action buttons.
message (optional): A VirtualNode providing a descriptive message.
1type Visibility = "automatic" | "hidden" | "visible"
Sheet
Presents a modal sheet from the bottom of the screen when the isPresented condition is true. Multiple sheets can be registered using an array of presentation objects.
1sheet?: ModalPresentation | ModalPresentation[]
Full Screen Cover
Presents a modal view that covers the entire screen. Multiple views can be registered using an array of presentation objects.
1fullScreenCover?: ModalPresentation | ModalPresentation[]
Popover
Presents a popover when the isPresented condition is true. Popovers can be configured with arrow direction and adaptation strategies.
1popover?: PopoverPresentation | PopoverPresentation[]
PopoverPresentation
1type PopoverPresentation = ModalPresentation & {
2 arrowEdge?: Edge
3 presentationCompactAdaptation?: PresentationAdaptation | {
4 horizontal: PresentationAdaptation
5 vertical: PresentationAdaptation
6 }
7}
Properties
arrowEdge (optional): Defines the edge of the anchor that the popover arrow points to. Defaults to "top".
presentationCompactAdaptation (optional): Specifies how the presentation adapts in compact size classes.
1type Edge = "top" | "bottom" | "leading" | "trailing"
ModalPresentation
Defines a common interface used by sheet, popover, and fullScreenCover.
1type ModalPresentation = {
2 isPresented: boolean
3 onChanged: (isPresented: boolean) => void
4 content: VirtualNode
5}
Properties
isPresented: A boolean value indicating whether the modal is shown.
onChanged: A callback that updates the isPresented state when the modal is dismissed.
content: A VirtualNode representing the modal view content.
PresentationAdaptation
Specifies the strategy used when adapting modal presentations to different size classes.
1type PresentationAdaptation =
2 | "automatic"
3 | "fullScreenCover"
4 | "none"
5 | "popover"
6 | "sheet"
automatic: Uses the system default adaptation.
fullScreenCover: Prefers a full-screen cover style.
popover: Prefers a popover style.
sheet: Prefers a sheet style.
none: Disables adaptation if possible.
Example Usage
Presenting a Sheet
1<Button
2 title={"Present"}
3 action={() => setIsPresented(true)}
4 sheet={{
5 isPresented: isPresented,
6 onChanged: setIsPresented,
7 content: <VStack>
8 <Text>Sheet content</Text>
9 <Button title={"Dismiss"} action={() => setIsPresented(false)} />
10 </VStack>
11 }}
12/>
Presenting a Popover
1<Button
2 title={"Show Popover"}
3 action={() => setIsPresented(true)}
4 popover={{
5 isPresented: isPresented,
6 onChanged: setIsPresented,
7 presentationCompactAdaptation: "popover",
8 content: <Text>Popover content</Text>,
9 arrowEdge: "top",
10 }}
11/>
Presenting a Full Screen Cover
1<Button
2 title={"Present"}
3 action={() => setIsPresented(true)}
4 fullScreenCover={{
5 isPresented: isPresented,
6 onChanged: setIsPresented,
7 content: <VStack>
8 <Text>A full-screen modal view.</Text>
9 </VStack>
10 }}
11/>
Configuring Sheet Height
1sheet={{
2 isPresented: isPresented,
3 onChanged: setIsPresented,
4 content: <VStack
5 presentationDetents={[200, "medium", "large"]}
6 presentationDragIndicator={"visible"}
7 >
8 <Text>Resizable sheet</Text>
9 </VStack>
10}}
Presenting an Alert
1<Button
2 title={"Present"}
3 action={() => setIsPresented(true)}
4 alert={{
5 isPresented: isPresented,
6 onChanged: setIsPresented,
7 title: "Alert",
8 message: <Text>Everything is OK</Text>,
9 actions: <Button title={"OK"} action={() => {}} />
10 }}
11/>
Presenting a Confirmation Dialog
1<Button
2 title={"Present"}
3 action={() => setIsPresented(true)}
4 confirmationDialog={{
5 isPresented,
6 onChanged: setIsPresented,
7 title: "Do you want to delete this image?",
8 actions: <Button title={"Delete"} role={"destructive"} action={() => {}} />
9 }}
10/>